home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / editor / j414src.arc / GETCH.UNX < prev    next >
Text File  |  1989-10-10  |  3KB  |  131 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #include "tune.h"
  9.  
  10. #ifdef MSDOS
  11.  
  12. #include <bios.h>
  13. #include <dos.h>
  14.  
  15. #include "jove.h"
  16.  
  17. private void waitfun proto((void));
  18.  
  19. extern int UpdModLine;
  20. #ifdef IBMPC
  21. static char last = 0;
  22. extern int specialkey;
  23. #endif
  24.  
  25. getrawinchar()
  26. {
  27. #ifdef RAINBOW
  28.     union REGS regs;
  29. #endif /* RAINBOW */
  30. #ifdef IBMPC
  31.     unsigned scan;
  32.  
  33.     if (specialkey = last) {
  34.         scan = last;
  35.         last = 0;
  36.         return scan;
  37.     }
  38. #endif /* IBMPC */
  39.  
  40.     while (!rawkey_ready())
  41.         waitfun();
  42.  
  43. #ifdef IBMPC
  44.     scan = _bios_keybrd(_KEYBRD_READ);
  45.     if ((scan&0xff) == 0) {
  46.         last = (char) (scan >> 8);
  47.         return 0xFF;
  48.     }
  49.     return scan&0xff;
  50. #else /* IBMPC */
  51. #ifdef RAINBOW
  52. waitloop:
  53.     regs.x.di = 2;
  54.     int86(0x18, ®s, ®s);
  55.     if (regs.h.al != 0)    /* should never happen, but who knows */
  56.         return regs.h.al;
  57.     else
  58.         goto waitloop;
  59. #else /* RAINBOW */
  60.     return bdos(0x06, 0x00ff, 0xff) & 0xff;
  61. #endif /* RAINBOW */
  62. #endif /* IBMPC */
  63. }
  64.  
  65. static int waiting = 0;
  66.  
  67. rawkey_ready()
  68. {
  69. #ifndef IBMPC
  70.     union REGS regs;
  71. #endif
  72.  
  73.     if (waiting)
  74.         return 0;
  75. #ifdef IBMPC
  76.     if (last)
  77.         return 1;
  78.  
  79.     return _bios_keybrd(_KEYBRD_READY);
  80. #else /* IBMPC */
  81. #ifdef RAINBOW
  82.     regs.x.di = 4;
  83.     int86(0x18, ®s, ®s);
  84.     return regs.h.cl != 0;
  85. #else /* RAINBOW */
  86.     regs.h.ah = 0x44;        /* ioctl call */
  87.     regs.x.bx = 0;            /* stdin file handle */
  88.     regs.h.al = 0x06;        /* get input status */
  89.     intdos(®s, ®s);
  90.     return regs.h.al & 1;
  91. #endif /* RAINBOW */
  92. #endif /* IBMPC */
  93. }
  94.  
  95. #ifdef IBMPC
  96. static long timecount, lastcount = 0;
  97. #else
  98. static char lastmin = 0;
  99. #endif
  100.  
  101.  
  102. private void
  103. waitfun()
  104. {
  105. #ifndef IBMPC
  106.     struct dostime_t tc;
  107. #endif
  108.  
  109.     if (UpdModLine) {
  110.         waiting = 1;
  111.         redisplay();
  112.         waiting = 0;
  113.         return;
  114.     }
  115. #ifdef IBMPC
  116.     if (_bios_timeofday(_TIME_GETCLOCK, &timecount) ||  /* after midnight */
  117.         (timecount > lastcount + 0x444) ) {
  118.         lastcount = timecount;
  119.         UpdModLine = 1;
  120.     }
  121. #else
  122.     _dos_gettime(&tc);
  123.     if (tc.minute != lastmin) {
  124.         UpdModLine = 1;
  125.         lastmin = tc.minute;
  126.     }
  127. #endif
  128. }
  129.  
  130. #endif /* MSDOS */
  131.